import axios from 'axios'
// 导入获取token的方法
import { getToken, getTime } from '@/utils/auth'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router/index'
// 创建副本
const _fetch = axios.create({
  baseURL: process.env.VUE_APP_BASE_API
  // timeout: 5000
})
// 收集取消axios的方法
let cancelFnArr = []
// 定义切换页面时取消所有axios请求的方法  在导航守卫中使用
window.cancelAll = function(){
  cancelFnArr = cancelFnArr.filter(item=>{
    item.fn()
  })
}
// 请求拦截器
_fetch.interceptors.request.use(
  config => {
    if (getToken()) {
      config.headers.Authorization = `Bearer ${getToken()}`
      // 前端处理token过期
      // let newTime = Date.now()
      // let oldTime = getTime()
      // if (newTime - oldTime > 2000) {
      //   store.dispatch('user/deleteUser')
      //   Message.success(new Error('token过期拉'))
      //   router.push('/login?redirect=' + location.href.split('#')[1])
      // }
      cancelFnArr = cancelFnArr.filter((item, index) => {
        if (item.method === config.method && item.url === config.method) {
          item.fn()
          return false
        }
        return true
      })
    }
    // 取消axios请求处理
    config.cancelToken = new axios.CancelToken(cancelFn => {
      cancelFnArr.push({
        fn: cancelFn,
        url: config.ur,
        method: config.method
      })
    })

    return config
  },
  error => {
    return Promise.reject(error)
  }
)
// 响应拦截器
_fetch.interceptors.response.use(
  response => {
    if (response.data.success) {
      // 用户名和密码正确
      return response.data.data
    } else {
      // 用户名和密码不正确
      // 提示用户
      Message.error(response.data.message)
      return Promise.reject(new Error(response.data.message))
    }
  },
  error => {
    // token过期处理
    if (
      error.response &&
      error.response.data &&
      error.response.data.code === 10002
    ) {
      // token过期 调用vuex中的方法
      store.commit('user/deleteUser')
      // 提示用户
      Message.error(error.response.data.message)
      // 携带路由跳转到登录页
      router.push('/login?redirect=' + localtion.href.split('#')[1])
    }
    return Promise.reject(error)
  }
)
// 让响应拦截器return Promise.reject时，浏览器控制台不输出红色警告
function ajax (xxx) {
  return new Promise((resolve, reject) => {
    _fetch(xxx)
      .then(res => {
        resolve(res)
      })
      .catch(error => {
        console.log(error)
      })
  })
}
export default ajax
